package com.ittest.web.controller;


import com.ittest.domain.system.SysLog;
import com.ittest.domain.system.User;
import com.ittest.service.system.RoleService;
import com.ittest.service.system.SysLogService;
import com.ittest.service.system.impl.RoleServiceImpl;
import com.ittest.service.system.impl.SysLogServiceImpl;
import com.ittest.utils.BeanUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.UUID;

/*
    抽取一个Servlet
    作用：
        1.用于一个Servlet处理多个功能，通过不同的方法名
        2.用于初始化service对象
 */
public class BaseServlet extends HttpServlet {
    protected SysLogService sysLogService;    // 日志管理业务对象
    protected RoleService roleService;    // 角色管理业务对象


    @Override
    public void init() throws ServletException {
        // 初始化实现类对象
        sysLogService = new SysLogServiceImpl();
        roleService = new RoleServiceImpl();


    }

    /*
        根据页面请求不同方法的名称参数实现对应功能的方法
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.获取URI
        String uri = req.getRequestURI();
        // 截取请求中请求方法参数的名称
        String methodName = uri.substring(uri.lastIndexOf("/") + 1);

        // 获取执行的方法对象
        try {
            // 获取方法，无论私有还是公共的
            Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            // 暴力反射
            method.setAccessible(true);
            // 执行方法
            // 执行方法开始时间戳
            long start = System.currentTimeMillis();
            method.invoke(this,req,resp);
            // 执行方法结束时间戳
            long end = System.currentTimeMillis();
            // 执行时间
            long excuteTime = end-start;
            // 获取id
            String remoteAddr = req.getRemoteAddr();
            System.out.println(remoteAddr);
            // 获取session
            HttpSession session = req.getSession();
            User loginUser = (User)session.getAttribute("loginUser");


            SysLog log = BeanUtil.fillBean(req,SysLog.class,"yyyy-MM-dd HH:mm:ss");
            // Id
            String id = UUID.randomUUID().toString();
            log.setId(id);
            // 访问时间
            log.setVisitTime(new Date(start));
            // 访问用户
            log.setUsername(loginUser.getUsername());
            // 访问IP
            log.setIp(remoteAddr);
            // 资源URL
            log.setUrl(uri);
            // 执行时间
            log.setExecutionTime(excuteTime);
            // 访问方法
            log.setMethod(methodName);

            // 业务层处理
            sysLogService.save(log);

        } catch (Exception e) {
            e.printStackTrace();

        }

    }
}
